// Copyright 2007-2009 Comdiv (F. Sadykov) - http://code.google.com/u/fagim.sadykov/
// 
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// 
//     http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// MODIFICATIONS HAVE BEEN MADE TO THIS FILE


using System;
using Boo.Lang.Compiler;
using Boo.Lang.Compiler.Ast;

#if MONORAIL
namespace Castle.MonoRail.Views.Brail
#else

namespace MvcContrib.Comdiv.ViewEngines.Brail
#endif
{
    public class InitMacro : LexicalInfoPreservingMacro{
        protected override Statement ExpandImpl(MacroStatement macro){
            if (macro.Arguments.Count == 0){
                throw new Exception("init must be called with arguemnts");
            }

            var var_ = macro.Arguments[0];
            Expression initializer = new NullLiteralExpression();
            if(var_ is BinaryExpression){
                initializer = ((BinaryExpression)var_).Right;
                var_ = ((BinaryExpression) var_).Left;
               
            }
            var name = var_.ToCodeString();
            
            var result = new Block();
            result.Add(new DeclarationStatement(new Declaration("___" + name, null),
                                                initializer));
            var ifer = new Block();
            ifer.Add(new BinaryExpression(BinaryOperatorType.Assign, new ReferenceExpression("___" + name),
                                          new ReferenceExpression(name)));
            result.Add(new IfStatement(
                           new MethodInvocationExpression(AstUtil.CreateReferenceExpression("IsDefined"),
                                                          new StringLiteralExpression(name)),
                           ifer, null));
            result.Add(new BinaryExpression(BinaryOperatorType.Assign, new ReferenceExpression(name),
                                            new ReferenceExpression("___" + name)));
            return result;
        }
    }
}